package com.lmaye.eshop.inventory.common;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.lmaye.eshop.inventory.constant.ErrorInfo;
import lombok.AllArgsConstructor;
import lombok.Data;

import java.io.Serializable;
import java.util.Objects;

/**
 * <pre>
 *   ┏┓　　　┏┓
 * ┏┛┻━━━┛┻┓
 * ┃　　　　　　　┃
 * ┃　　　━　　　┃
 * ┃　┳┛　┗┳　┃
 * ┃　　　　　　　┃
 * ┃　　　┻　　　┃
 * ┃　　　　　　　┃
 * ┗━┓　　　┏━┛
 * 　　┃　　　┃神兽保佑
 * 　　┃　　　┃代码无BUG！
 * 　　┃　　　┗━━━┓
 * 　　┃　　　　　　　┣┓
 * 　　┃　　　　　　　┏┛
 * 　　┗┓┓┏━┳┓┏┛
 * 　　　┃┫┫　┃┫┫
 * 　　　┗┻┛　┗┻┛
 * </pre>
 * -- Response 请求响应
 *
 * @author lmay.Zhou
 * @date 2019/3/19 23:06 星期二
 * @qq 379839355
 * @email lmay@lmaye.com
 */
@Data
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Response<T> implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 响应代码
     */
    private Integer code;

    /**
     * 响应消息
     */
    private String msg;

    /**
     * 响应数据
     */
    private T data;

    /**
     * 响应成功
     *
     * @param data  响应数据
     * @param <T>   泛型
     * @return  Response
     */
    public static <T> Response<T> success(T data) {
        return new Response<>(200, "Success", data);
    }

    /**
     * 响应成功
     *
     * @param msg   响应消息
     * @param data  响应数据
     * @param <T>   泛型
     * @return  Response
     */
    public static <T> Response<T> success(String msg, T data) {
        return new Response<>(200, msg, data);
    }

    /**
     * 响应失败
     *
     * @param <T>   泛型
     * @return  Response
     */
    public static <T> Response<T> failed() {
        ErrorInfo errorInfo = ErrorInfo.error();
        return new Response<>(errorInfo.getCode(), errorInfo.getMsg(), null);
    }

    /**
     * 响应失败
     * - 自定义错误消息
     *
     * @param msg   错误消息
     * @param <T>   泛型
     * @return  Response
     */
    public static <T> Response<T> failed(String msg) {
        ErrorInfo errorInfo = ErrorInfo.error(msg);
        return new Response<>(errorInfo.getCode(), errorInfo.getMsg(), null);
    }

    /**
     * 响应失败
     * - 自定义错误对象
     *
     * @param errorInfo 错误对象
     * @param <T>       泛型
     * @return  Response
     */
    public static <T> Response<T> failed(ErrorInfo errorInfo) {
        return new Response<>(errorInfo.getCode(), errorInfo.getMsg(), null);
    }

    /**
     * 请求响应
     *
     * @param code  响应代码
     * @param msg   响应消息
     * @param data  响应数据
     * @param <T>   泛型
     * @return  Response
     */
    public static <T> Response<T> response(Integer code, String msg, T data) {
        return new Response<>(code, msg, data);
    }

    /**
     * 是否响应成功
     *
     * @return  boolean
     */
    public boolean isSuccess() {
        if(Objects.isNull(code)) {
            return false;
        }
        return Objects.equals(Integer.valueOf("200"), code);
    }
}
